home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
DTP
/
DTP_TEX
/
3239.ZIP
/
DVIMTP.ZIP
/
READPK.H
< prev
next >
Wrap
Text File
|
1987-09-30
|
6KB
|
167 lines
/* -*-C-*- readpk.h */
/*-->readpk*/
/**********************************************************************/
/******************************* readpk *******************************/
/**********************************************************************/
int
readpk() /* return 0 on success, EOF on failure */
{
UNSIGN32 checksum;
long end_of_packet; /* pointer to byte following character packet */
register BYTE flag_byte;
UNSIGN32 packet_length;
long start_of_packet; /* pointer to start of character packet */
register struct char_entry *tcharptr;/* temporary char_entry pointer */
register UNSIGN32 the_char;
/* Read a PK file, extracting character metrics and raster
locations. */
/******************************************************************/
/* Process the preamble parameters */
(void)REWIND(fontfp); /* start at beginning of file */
if ((BYTE)nosignex(fontfp,(BYTE)1) != PKPRE)
{
(void)warning("readpk(): PK font file does not start with PRE byte");
return(EOF);
}
if ((BYTE)nosignex(fontfp,(BYTE)1) != PKID)
{
(void)warning(
"readpk(): PK font file PRE byte not followed by ID byte");
return(EOF);
}
if (FSEEK(fontfp,(long)nosignex(fontfp,(BYTE)1),1))
{
(void)warning("readpk(): PK font file has garbled comment string");
return(EOF); /* skip comment string */
}
fontptr->designsize = nosignex(fontfp,(BYTE)4);
checksum = nosignex(fontfp,(BYTE)4); /* checksum */
if ((fontptr->c != 0L) && (checksum != 0L) && (fontptr->c != checksum))
{
(void)sprintf(message,
"readpk(): font [%s] has checksum = 10#%010lu [16#%08lx] [8#%011lo] \
different from DVI checksum = 10#%010lu [16#%08lx] [8#%011lo]. \
TeX preloaded .fmt file is probably out-of-date with respect to new fonts.",
fontptr->name, fontptr->c, fontptr->c, fontptr->c,
checksum, checksum, checksum);
(void)warning(message);
}
fontptr->hppp = (UNSIGN32)nosignex(fontfp,(BYTE)4);
fontptr->vppp = (UNSIGN32)nosignex(fontfp,(BYTE)4);
fontptr->min_m = 0L; /* these are unused in PK format */
fontptr->max_m = 0L;
fontptr->min_n = 0L;
fontptr->max_n = 0L;
fontptr->magnification = (UNSIGN32)( 0.5 + 5.0 * 72.27 *
(float)(fontptr->hppp) / 65536.0 ); /* from GFtoPXL Section 53 */
/******************************************************************/
/* Process the characters until the POST byte is reached */
(void)skpkspec(); /* skip any PK specials */
start_of_packet = (long)FTELL(fontfp);
while ((flag_byte = (BYTE)nosignex(fontfp,(BYTE)1)) != PKPOST)
{
flag_byte &= 0x07;
switch(flag_byte) /* flag_byte is in 0..7 */
{
case 0:
case 1:
case 2:
case 3: /* short character preamble */
packet_length = (UNSIGN32)flag_byte;
packet_length <<= 8;
packet_length += (UNSIGN32)nosignex(fontfp,(BYTE)1);
the_char = (UNSIGN32)nosignex(fontfp,(BYTE)1);
if (the_char >= NPXLCHARS)
{
(void)warning(
"readpk(): PK font file character number is too big for me");
return(EOF);
}
tcharptr = &(fontptr->ch[the_char]);
end_of_packet = (long)FTELL(fontfp) + (long)packet_length;
tcharptr->tfmw = (UNSIGN32)(((float)nosignex(fontfp,(BYTE)3) *
(float)fontptr->s) / (float)(1L << 20));
tcharptr->dx = (INT32)nosignex(fontfp,(BYTE)1) << 16;
tcharptr->dy = 0L;
tcharptr->pxlw = (UNSIGN16)PIXROUND(tcharptr->dx, 1.0/65536.0);
tcharptr->wp = (COORDINATE)nosignex(fontfp,(BYTE)1);
tcharptr->hp = (COORDINATE)nosignex(fontfp,(BYTE)1);
tcharptr->xoffp = (COORDINATE)signex(fontfp,(BYTE)1);
tcharptr->yoffp = (COORDINATE)signex(fontfp,(BYTE)1);
break;
case 4:
case 5:
case 6: /* extended short character preamble */
packet_length = (UNSIGN32)(flag_byte & 0x03);
packet_length <<= 16;
packet_length += (UNSIGN32)nosignex(fontfp,(BYTE)2);
the_char = (UNSIGN32)nosignex(fontfp,(BYTE)1);
if (the_char >= NPXLCHARS)
{
(void)warning(
"readpk(): PK font file character number is too big for me");
return(EOF);
}
tcharptr = &(fontptr->ch[the_char]);
end_of_packet = (long)FTELL(fontfp) + (long)packet_length;
tcharptr->tfmw = (UNSIGN32)(((float)nosignex(fontfp,(BYTE)3) *
(float)fontptr->s) / (float)(1L << 20));
tcharptr->dx = (INT32)nosignex(fontfp,(BYTE)2) << 16;
tcharptr->dy = 0L;
tcharptr->pxlw = (UNSIGN16)PIXROUND(tcharptr->dx, 1.0/65536.0);
tcharptr->wp = (COORDINATE)nosignex(fontfp,(BYTE)2);
tcharptr->hp = (COORDINATE)nosignex(fontfp,(BYTE)2);
tcharptr->xoffp = (COORDINATE)signex(fontfp,(BYTE)2);
tcharptr->yoffp = (COORDINATE)signex(fontfp,(BYTE)2);
break;
case 7: /* long character preamble */
packet_length = (UNSIGN32)nosignex(fontfp,(BYTE)4);
the_char = (UNSIGN32)nosignex(fontfp,(BYTE)4);
if (the_char >= NPXLCHARS)
{
(void)warning(
"readpk(): PK font file character number is too big for me");
return(EOF);
}
tcharptr = &(fontptr->ch[the_char]);
end_of_packet = (long)FTELL(fontfp) + (long)packet_length;
tcharptr->tfmw = (UNSIGN32)(((float)nosignex(fontfp,(BYTE)4) *
(float)fontptr->s) / (float)(1L << 20));
tcharptr->dx = (INT32)signex(fontfp,(BYTE)4);
tcharptr->dy = (INT32)signex(fontfp,(BYTE)4);
tcharptr->pxlw = (UNSIGN16)PIXROUND(tcharptr->dx, 1.0/65536.0);
tcharptr->wp = (COORDINATE)nosignex(fontfp,(BYTE)4);
tcharptr->hp = (COORDINATE)nosignex(fontfp,(BYTE)4);
tcharptr->xoffp = (COORDINATE)signex(fontfp,(BYTE)4);
tcharptr->yoffp = (COORDINATE)signex(fontfp,(BYTE)4);
break;
} /* end switch */
tcharptr->fontrp = start_of_packet;
(void)FSEEK(fontfp,end_of_packet,0); /* position to end of packet */
(void)skpkspec(); /* skip any PK specials */
start_of_packet = (long)FTELL(fontfp);
} /* end while */
#if (BBNBITGRAPH | HPJETPLUS | POSTSCRIPT | IMPRESS | CANON_A2)
(void)newfont();
#endif
return(0);
}